package com.boot.adminservice.map.service.strategy;

import com.boot.adminapi.map.constants.MapConstants;
import com.boot.adminservice.map.domain.dto.SysRegionDTO;
import com.boot.commonredis.service.RedisService;
import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * 获取城市列表具体策略:先查Redis缓存，未命中再从数据库查询策略
 */
@Component("fromRedisStrategy")
public class FromRedisStrategy implements GetCityListStrategy{

    /**
     * Redis缓存服务对象
     */
    @Autowired
    private RedisService redisService;

    /**
     * 数据库查询策略对象
     */
    @Autowired
    private FromDBStrategy fromDBStrategy;


    /**
     * 城市列表查询V2 Redis缓存方案
     * @return 城市列表信息
     */
    @Override
    public List<SysRegionDTO> getCityList() {
        // 1 先查询缓存
        List<SysRegionDTO> cache = redisService.getCacheObject(MapConstants.CACHE_MAP_CITY_KEY, new TypeReference<List<SysRegionDTO>>() {
        });
        if (cache != null) {
            return cache;
        }
        // 2 缓存未命中 查数据库，把城市摘出来
        List<SysRegionDTO> result = fromDBStrategy.getCityList();
        // 3 设置缓存
        redisService.setCacheObject(MapConstants.CACHE_MAP_CITY_KEY, result);
        return result;
    }

    /**
     * 按首字母A-Z分类城市列表查询V2 Redis缓存方案
     * @return 按首字母A-Z分类的城市列表信息
     */
    @Override
    public  Map<String, List<SysRegionDTO>> getCityPyList() {
        // 1 先查询缓存
        Map<String, List<SysRegionDTO>> cache = redisService.getCacheObject(MapConstants.CACHE_MAP_CITY_PINYIN_KEY, new TypeReference<Map<String, List<SysRegionDTO>>>() {
        });
        if (cache != null) {
            return cache;
        }
        // 2 缓存未命中 查数据库，把城市分类
        Map<String, List<SysRegionDTO>> result = fromDBStrategy.getCityPyList();
        // 3 设置缓存
        redisService.setCacheObject(MapConstants.CACHE_MAP_CITY_PINYIN_KEY, result);
        return result;
    }
}
